package Logic;


import java.sql.SQLException;

import Interfaces.GUI;
import Interfaces.Logic;
import Logic.BD.AlmacenJugadoresPartidas;
import Logic.Juego.Casilla;
import Logic.Juego.Pieza;
import Logic.Juego.Posicion;
import Logic.Juego.Tablero;
import Logic.Jugador.Partida;
import Logic.Piezas.Alfil;
import Logic.Piezas.Caballo;
import Logic.Piezas.Peon;
import Logic.Piezas.Reina;
import Logic.Piezas.Rey;
import Logic.Piezas.Torre;

class JuegoAjedrez implements Logic{
	
	//Atributos del juego Ajedrez
	private static String NombreJuego="Ajedrez";
	private static int NumJugadores=2;
	static Tablero tableroLogic;
	static Casilla[][]tab;
	//Tablero grafico (Interfaz GUI)
	GUI interfaceTablero=null;
	
	//Atributos para llevar a cabo la logica del juego
	private boolean seleccionada=false;
	boolean turno = false;  // Si el turno es igual a false, este corresponde al primer jugador, siendo true corresponde el turno al segundo.
							// El primer jugador siempre sera por defecto el de color blanco.
	private int xIni;
	private int yIni;
	private int xFin;
	private int yFin;
	private String color;
	private boolean vacia;
	private boolean comer;
	private boolean caminoLibre;

	private boolean permisoMover = false;
	private int tipoPieza;
	private Rey rey = new Rey(null,null,null);
	private Reina reina = new Reina(null,null,null);
	private Alfil alfil = new Alfil(null,null,null);
	private Peon peon = new Peon(null,null,null);
	private Torre torre = new Torre(null,null,null);
	private Caballo caballo = new Caballo(null,null,null);
	
	
	JuegoAjedrez(GUI InterfaceTablero)
	{
	interfaceTablero=InterfaceTablero;
	construirTableroLogico();
	inicializarTableroLogico();
	}
	
	public void setInterfaceGrafico(GUI InterfaceTablero)
	{
		interfaceTablero=InterfaceTablero;
	}
	
	public GUI getInterfaceGrafico()
	{
		return interfaceTablero;
	}
	
	public int getNumeroJugadores() {
		// TODO Auto-generated method stub
		return NumJugadores;
	}

	public String getNombre() {
		// TODO Auto-generated method stub
		return NombreJuego;
	}
	
	public Tablero getTableroLogico() {
		return tableroLogic;
	}

	private static void construirTableroLogico() {
		Tablero tab=new Tablero(8);
		tableroLogic=tab;
	}

	public void inicializarTableroLogico() {
		// TODO Auto-generated method stub
		tab=tableroLogic.getTablero();
		inicializarCasillas(tab);
		inicializarPiezas(tab);
		tableroLogic.mostrarPiezas();	
	}

	private Object sacarPieza(int x, int y)
	{
		Pieza pieza;
		if(tab[x][y].getPieza()!=null)
		{	
			pieza = tab[x][y].getPieza();
			color = pieza.getColor();
			return pieza;
		}
		else
		{
			return null;
		}
	}
	
	private boolean comprobarVacia(int x, int y, String color)
	{
		Pieza pieza = tab[x][y].getPieza();
		vacia = false;
		if(pieza!=null)
		{	
			if(!pieza.getColor().equals(color) )
			{
				vacia = true;
			}
		}
		else
		{
			vacia = true;
		}
		return vacia;
	}
	private boolean comer(int x, int y)
	{
		Pieza pieza = tab[x][y].getPieza();
		comer = false;
		if(pieza!=null)
		{	
			comer = true;
		}
		return comer;
	}
	private void limpiarCasilla(int x, int y)
	{
		tab[x][y].setPieza(null);	
	}
	private void colocarPieza(Object o, int x, int y)
	{
		tab[x][y].setPieza((Pieza) o);
	}
	private boolean viaLibreAlfil(int xIni,int yIni ,int xFin ,int yFin)
	{
		boolean libre = false;

		if(xFin>xIni && yFin>yIni)
		{	
			libre = true;
			int c = yIni+1;
			for( int z=xIni+1 ;z<xFin; z++)
			{
				Pieza pieza = tab[z][c].getPieza();
				if(pieza!=null)
				{
					System.out.println("Encontre piezaaaaaaa"+z+c);
					libre = false;
				}
				c++;
			}
		}
		
		if(xFin<xIni && yFin<yIni)
		{	
			libre = true;
			int c = yIni-1;
			for( int z=xIni-1 ;z>xFin; z--)
			{
				if(tab[z][c].getPieza() != null)
				{
					System.out.println("Encontre piezaaaaaaa"+z+c);
					libre = false;
				}
				c--;	
			}
		}
		
		if(xFin>xIni && yFin<yIni)
		{	
			libre = true;
			int c = yIni-1;

			for( int z=xIni+1 ;z<xFin; z++)
			{
					if(tab[z][c].getPieza() != null)
					{
						System.out.println("Encontre piezaaaaaaa"+z+c);
						libre = false;
					}
					c--;
			}
		}
		
		if(xFin<xIni && yFin>yIni)
		{	
			libre = true;
			int c = yIni+1;
			for( int z=xIni-1 ;z>xFin; z--)
			{
				if(tab[z][c].getPieza() != null)
				{
					System.out.println("Encontre piezaaaaaaa"+z+c);
					libre = false;
				}
				c++;
			}
		}
		return libre;
	}

	private boolean viaLibreTorre(int xIni,int yIni,int xFin,int yFin)
	{
		boolean libre = false;
		if(xIni==xFin)
		{
			libre = true;
			System.out.println("Entro en X iguales");
			if(yFin>yIni)
			{	
				for(int z=yIni+1;z<yFin;z++)
				{	
					if(tab[xIni][z].getPieza() != null)
					{
						System.out.println("Encontre piezaaaaaaa"+z);
						libre = false;
					}
				}
			}
			else
			{
				for(int z=yIni-1;z>yFin;z--)
				{
					if(tab[xIni][z].getPieza() != null)
					{
						System.out.println("Encontre piezaaaaaaa"+z);
						libre = false;
					}
				}
			}
		}
		if(yIni==yFin)
		{
			libre = true;
			System.out.println("Entro en Y iguales");
			if(xFin>xIni)
			{	
				for(int z=xIni+1;z<xFin;z++)
				{	
					if(tab[z][yIni].getPieza() != null)
					{
						System.out.println("Encontre piezaaaaaaa"+z+yIni);
						libre = false;
					}
					System.out.println("Estoy en el for.");
				}
			}
			else
			{
				for(int z=xIni-1;z>xFin;z--)
				{
					if(tab[z][yIni].getPieza() != null)
					{
						System.out.println("Encontre piezaaaaaaa"+z+yIni);
						libre = false;
					}
				}
			}	
		}
		return libre;
	}

	private void cambiarTurno() {
		turno = !turno;
		
	}
	
	private static void inicializarCasillas(Casilla[][] tab){
	
		for(int fila=0;fila<tab[0].length;fila++)
		{
			for(int columna=0;columna<tab[1].length;columna++)
			{
				if(fila%2==0)
				{
					if(columna%2!=0)
					{
						Casilla casilla = new Casilla("Marron",false, false, false, null);
						tab[fila][columna]=casilla;
					}
					else
					{
						Casilla casilla = new Casilla("Blanco",false, false, false, null);
						tab[fila][columna]=casilla;
					}
				}
				
				else
				{
					if(columna%2==0)
						{
							Casilla casilla = new Casilla("Marron",false, false, false, null);
							tab[fila][columna]=casilla;
	                    }
					else
						{
							Casilla casilla = new Casilla("Blanco",false, false, false, null);
							tab[fila][columna]=casilla;
						}

				}
						

			}
		}
		
	}
	
	private void inicializarPiezas(Casilla[][]tab){
		inicializarPeones(tab,"Blanco",1,"src/GUI/Tablero/Imagenes/BPeon.png");
		
		Torre Btorre1=new Torre("Blanco", new Posicion (0,0), "src/GUI/Tablero/Imagenes/BTorre.png");
		inicializarPiezaIndividual(tab, Btorre1);
		
		Caballo Bcaballo1=new Caballo("Blanco", new Posicion (0,1), "src/GUI/Tablero/Imagenes/BCaballo.png");
		inicializarPiezaIndividual(tab, Bcaballo1);
		
		Alfil Balfil1=new Alfil("Blanco", new Posicion (0,2), "src/GUI/Tablero/Imagenes/BAlfil.png");
		inicializarPiezaIndividual(tab, Balfil1);
		
		Rey Brey=new Rey("Blanco", new Posicion (0,3), "src/GUI/Tablero/Imagenes/BRey.png");
		inicializarPiezaIndividual(tab, Brey);
		
		Reina Breina=new Reina("Blanco", new Posicion (0,4), "src/GUI/Tablero/Imagenes/BReina.png");
		inicializarPiezaIndividual(tab, Breina);
		
		Alfil Balfil2=new Alfil("Blanco", new Posicion (0,5), "src/GUI/Tablero/Imagenes/BAlfil.png");
		inicializarPiezaIndividual(tab, Balfil2);
		
		Caballo Bcaballo2=new Caballo("Blanco", new Posicion (0,6), "src/GUI/Tablero/Imagenes/BCaballo.png");
		inicializarPiezaIndividual(tab, Bcaballo2);
		
		Torre Btorre2=new Torre("Blanco", new Posicion (0,7), "src/GUI/Tablero/Imagenes/BTorre.png");
		inicializarPiezaIndividual(tab, Btorre2);
		
		
		inicializarPeones(tab,"Negro",6,"src/GUI/Tablero/Imagenes/NPeon.png");
		
		Torre Ntorre1=new Torre("Negro", new Posicion (7,0), "src/GUI/Tablero/Imagenes/NTorre.png");
		inicializarPiezaIndividual(tab, Ntorre1);
		
		Caballo Ncaballo1=new Caballo("Negro", new Posicion (7,1), "src/GUI/Tablero/Imagenes/NCaballo.png");
		inicializarPiezaIndividual(tab, Ncaballo1);
		
		Alfil Nalfil1=new Alfil("Negro", new Posicion (7,2), "src/GUI/Tablero/Imagenes/NAlfil.png");
		inicializarPiezaIndividual(tab, Nalfil1);
		
		Rey Nrey=new Rey("Negro", new Posicion (7,3), "src/GUI/Tablero/Imagenes/NRey.png");
		inicializarPiezaIndividual(tab, Nrey);
		
		Reina Nreina=new Reina("Negro", new Posicion (7,4), "src/GUI/Tablero/Imagenes/NReina.png");
		inicializarPiezaIndividual(tab, Nreina);
		
		Alfil Nalfil2=new Alfil("Negro", new Posicion (7,5), "src/GUI/Tablero/Imagenes/NAlfil.png");
		inicializarPiezaIndividual(tab, Nalfil2);
		
		Caballo Ncaballo2=new Caballo("Negro", new Posicion (7,6), "src/GUI/Tablero/Imagenes/NCaballo.png");
		inicializarPiezaIndividual(tab, Ncaballo2);
		
		Torre Ntorre2=new Torre("Negro", new Posicion (7,7), "src/GUI/Tablero/Imagenes/NTorre.png");
		inicializarPiezaIndividual(tab, Ntorre2);
	}
	
	private void inicializarPeones(Casilla[][]tab,String color, int fila, String urlPeon){
		int columna=0;
		while(columna<8)
		{
		Peon peon = new Peon(color,new Posicion(fila,columna),urlPeon);
		tab[fila][columna].setPieza(peon);
		interfaceTablero.PonerPiezaEnCasilla(fila, columna, peon.getRutaImagen());
		columna++;
		}
	}
	
	private void inicializarPiezaIndividual(Casilla[][]tab,Pieza pieza)
	{
		tab[pieza.getPosicionActual().getPosX()][pieza.getPosicionActual().getPosY()].setPieza(pieza);
		interfaceTablero.PonerPiezaEnCasilla(pieza.getPosicionActual().getPosX(), pieza.getPosicionActual().getPosY(), pieza.getRutaImagen());
	
	}
	
	@Override
	public void CasillaPulsada(String cad){
		if(seleccionada==false)
		{
				xIni = Integer.parseInt(cad.charAt(0)+"");
				yIni = Integer.parseInt(cad.charAt(2)+"");
				System.out.println(xIni+"-"+yIni);

				
				Object pieza = sacarPieza(xIni,yIni);			// Saco la pieza que quiero mover.
				if(pieza!=null)
				{
					if(pieza instanceof Peon)
					{
						peon = (Peon) pieza;
						tipoPieza = 1;
						System.out.println("OK, sacar pieza.");
					}
					if(pieza instanceof Alfil)
					{
						alfil = (Alfil) pieza;
						tipoPieza = 2;
					}
					if(pieza instanceof Torre)
					{
						torre = (Torre) pieza;
						tipoPieza = 3;
					}
					if(pieza instanceof Rey)
					{
						rey = (Rey) pieza;
						tipoPieza = 4;
					}
					if(pieza instanceof Reina)
					{
						reina = (Reina) pieza;
						tipoPieza = 5;
					}
					if(pieza instanceof Caballo)
					{
						caballo = (Caballo) pieza;
						tipoPieza = 6;
					}
					seleccionada = true;
				}
		}
			else
			{	
																			// Saco la posicion a la que quiero mover.
					xFin = Integer.parseInt(cad.charAt(0)+"");
					yFin = Integer.parseInt(cad.charAt(2)+"");
					System.out.println(xFin+"*"+yFin);
					System.out.println("OK, sacar pos final.");
					
					vacia = comprobarVacia(xFin,yFin,color);
					comer = comer(xFin,yFin);
					
					if((xIni != xFin || yIni != yFin) && (vacia == true))
					{	
					
					if(tipoPieza!=0)
					{

						switch(tipoPieza)
						{ 
						case 1: permisoMover = peon.movimientoPermitido(xIni, yIni, xFin, yFin,color,comer);
								if(permisoMover==true)
								{
									System.out.println("OK, entro switch.");
									if(color.equals("Blanco") && turno==false)
									{	
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/BPeon.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");									
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(peon,xFin,yFin);
										cambiarTurno();
									}
									if(color.equals("Negro") && turno==true)
									{
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/NPeon.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");									
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(peon,xFin,yFin);
										cambiarTurno();
									}
									System.out.println("OK, pintar pieza.");

									
								}
						break;

						case 2: permisoMover = alfil.movimientoPermitido(xIni, yIni, xFin, yFin);
								caminoLibre = viaLibreAlfil(xIni,yIni,xFin,yFin);
								if(permisoMover==true && caminoLibre == true)
								{
									if(color.equals("Blanco") && turno==false)
									{	
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/BAlfil.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(alfil,xFin,yFin);
										cambiarTurno();
									}
									if(color.equals("Negro") && turno==true)
									{
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/NAlfil.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(alfil,xFin,yFin);
										cambiarTurno();
									}
									
							
								}							
						break;

						case 3: permisoMover = torre.movimientoPermitido(xIni, yIni, xFin, yFin);
								caminoLibre = viaLibreTorre(xIni,yIni,xFin,yFin);
								if(permisoMover==true && caminoLibre == true)
								{
									if(color.equals("Blanco") && turno==false)
									{	
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/BTorre.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(torre,xFin,yFin);
										cambiarTurno();
									}
									if(color.equals("Negro") && turno==true)
									{
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/NTorre.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(torre,xFin,yFin);
										cambiarTurno();
									}
									

							
								}			
						break;

						case 4:	permisoMover = rey.movimientoPermitido(xIni, yIni, xFin, yFin);
								if(permisoMover==true)
								{
									if(color.equals("Blanco") && turno==false)
									{	
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/BRey.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(rey,xFin,yFin);
										cambiarTurno();
									}
									if(color.equals("Negro") && turno==true)
									{
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/NRey.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(rey,xFin,yFin);
										cambiarTurno();
									}
								}		
						break;
						
						case 5:	permisoMover = reina.movimientoPermitido(xIni, yIni, xFin, yFin);
								if(xIni==xFin || yIni==yFin)
								{
									caminoLibre = viaLibreTorre(xIni,yIni,xFin,yFin);
								}
								else
								{
									caminoLibre = viaLibreAlfil(xIni,yIni,xFin,yFin);
								}
								if(permisoMover==true && caminoLibre==true )
								{
									if(color.equals("Blanco") && turno==false)
									{	
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/BReina.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(reina,xFin,yFin);
										cambiarTurno();
									}
									if(color.equals("Negro")  && turno==true)
									{
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/NReina.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(reina,xFin,yFin);
										cambiarTurno();
									}
								
							
								}
						break;
						
						case 6:	permisoMover = caballo.movimientoPermitido(xIni, yIni, xFin, yFin);
								if(permisoMover==true)
								{
									if(color.equals("Blanco") && turno==false)
									{	
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/BCaballo.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(caballo,xFin,yFin);
										cambiarTurno();
									}
									if(color.equals("Negro") && turno==true)
									{
										interfaceTablero.PonerPiezaEnCasilla(xFin,yFin,"src/GUI/Tablero/Imagenes/NCaballo.png");
										interfaceTablero.PonerPiezaEnCasilla(xIni,yIni,"");
										limpiarCasilla(xIni,yIni); // ACTUALIZAR TABLERO LOGICOOO
										colocarPieza(caballo,xFin,yFin);
										cambiarTurno();
									}
									

							
								}
						break;

						}; 	
					}
					tipoPieza = 0;
					permisoMover = false;
					seleccionada = false;
					
			}			
		}
	}


	@Override
	public void Jugador1Rendido(String j1,String j2) {
		// TODO Auto-generated method stub
		JugadorRendido(j1,j2);
	}


	@Override
	public void Jugador2Rendido(String j2,String j1) {
		// TODO Auto-generated method stub
		JugadorRendido(j2,j1);
	}

	public void JugadorRendido(String perdedor,String ganador){
		Partida p1 = new Partida(perdedor, ganador, false, false, true, "perdida");
		
		Partida p2 = new Partida(ganador, perdedor, false, false, true, "ganada");
		
		AlmacenJugadoresPartidas k =new AlmacenJugadoresPartidas();
		try {
			k.inicializarBD();
			k.guardarPartidaPerdida(p1, perdedor);
			k.guardarPartidaGanada(p2, ganador);
			System.out.println("Guardado partida...");
			k.finalizarBD();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	@Override
	public void Tablas(String j1,String j2) {
		// TODO Auto-generated method stub
		Partida p1 = new Partida(j1, j2, false, false, false, "empatada");
		p1.setFechaHora("J1 "+p1.obtenerFechaHora());
		
		Partida p2 = new Partida(j2, j1, false, false, false, "empatada");
		p2.setFechaHora("J2 "+p2.obtenerFechaHora());
		
		AlmacenJugadoresPartidas k =new AlmacenJugadoresPartidas();
		try {
			k.inicializarBD();
			k.guardarPartidaEmpatada(p1, j1);
			k.guardarPartidaEmpatada(p2, j2);
			System.out.println("Guardado partida...");
			k.finalizarBD();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ClassNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	

	
}
